#ifndef _Jeu
#define _Jeu

#include<stdlib.h>
#include<stdio.h>
#include"Espace.h"
#include"Visiteur.h"

/**
*\file Jeu.h
*\brief Fichier d'en-tête Jeu.h. 
*
*Ce fichier d'en-tête gère tout ce qui concerne le jeu, c'est-à-dire à la fois le personnage et l'espace
*
*\author Martin GONZALES
*\version version finale
*/


/**
* \struct jeu
* \brief La structure du jeu
* Jeu comporte deux champs *esp et *joueur qui sont respectivement le champs permettant d'avoir l'espace et le champs du personage vivant des l'espace 
*/
typedef struct
{
  espace * esp; /**< pointeur sur un espace*/
  visiteur * joueur; /**< pointeur sur un visiteur*/
}jeu;


/**
*\fn void jeuInit( jeu * laby,vecteur * position,char pied,char regard,int n);
*\brief Initialise le jeu.
*\param [out] *laby : pointeur sur le jeu à initialiser
*\param [in] *position : pointeur sur la position où l'on veut que le joueur soit au début du jeu
*\param [in] pied : case où sont les pieds du joueur au début du jeu
*\param [in] regard : case où regarde le joueur au début du jeu
*\param [in] n : taille du labyrinthe
*\pre Les coordonnées du vecteur doivent être positives et strictement inférieures à la taille de l'espace.
*\post Le jeu est initialisé avec un espace et un visiteur dans le tas. Le visiteur a les informations données par les paramètres.
*\warning Cette fonction implique obligatoire l'utilisation de la fonction freeJeu lorsqu'il n'y aura plus utilité du jeu.
**/
void jeuInit( jeu * laby,vecteur * position,char pied,char regard,int n);

/**
*\fn void initJeuFichier(jeu * laby, char fichier[]);
*\brief Initialise le jeu à partir d'un fichier texte. Ce fichier ne comprend aucun espace. Le premier caractère est la taille du cube, les trois suivant sont la case de départ, les deux suivant sont les directions classiques du joueur au début du jeu, elles doivent être orthogonales. La case d'arrivé est représenté par un 9. Le reste des cases représente l'espace. L'initialisation se fera ligne d'abort par les i, puis par les j, puis par les k. Il doit y avoir au moins la taille au cube de cases.
*\param [in] *laby : pointeur sur le jeu
*\param [in] fichier[] : chaîne de caractère donnat le nom du fichier.
*\pre Le fichier texte doit être dans le répertoire courant. La taille de l'espace est limitée à 9.
*\post le jeu est initialisé à partir du fichier.
*\warning Cette fonction implique obligatoirement l'utilisation de freeJeu.
*/
void initJeuFichier(jeu * laby, char fichier[]);


/**
*\fn void jeuInitAlea(jeu * laby,int n);
*\brief Initialise le jeu aléatoirement
*\param [in,out] *laby : pointeur sur le jeu à initialisé
*\param [in] n : taille de l'espace du jeu
*\pre Le jeu ne doit pas être initialisé.
*\post Le jeu est initialisé avec une taille n. 
*\warning Cette fonction implique obligatoirement l'utilisation de freeJeu.
*/
void jeuInitAlea(jeu * laby,int n);

/**
*\fn void Jouer(jeu * laby, char action);
*\brief Cette fonction gère le jeu selon les actions du joueur.
*\param [in,out] *laby : pointeur sur le jeu à modifier
*\param [in] action : 'a' pour avancer, 'd' pour tourner sur la droite, 'g' pour aller sur la gauche, 'b' pour se retourner
*\pre le jeu soit être initialisé.
*/
void Jouer(jeu * laby, char action);


/**
*\fn int testFin(jeu * laby);
*\brief Teste si le jeu est fini ou non.
*\param [in] *laby : C'est le jeu en question
*\pre laby doit etre initialise
*\return  1 si le visiteur est sur la case d'arrive, 0 sinon.
*/
int testFin(jeu * laby);

/**
*\fn void getJoueur(jeu * laby, visiteur * joueur);
*\brief Récupère le champs visiteur du jeu
*\param [in] *laby : pointeur sur le jeu où l'on travaille
*\param [out] *joueur : 
*\pre Le labyrinthe doit être initialisé
*\post joueur a récupéré les champs du champs joueur du labyrinthe
*/
void getJoueur(jeu * laby, visiteur * joueur);


/**
*\fn void getEspace(jeu * laby, espace * esp);
*\brief Récupère le champs espace du jeu
*\param [in] *laby : pointeur sur le jeu où l'on travaille
*\param [out] *esp : pointeur sur l'espace à récupérer
*\pre Le labyrinthe doit être initialisé et l'espace aussi.
*\post esp a récupéré les champs du champs joueur du labyrinthe.
*/
void getEspace(jeu * laby, espace * esp);

/**
*\fn void freeJeu(jeu* laby);
*\brief Libère du tas le jeu
*\param [in,out] *laby : pointeur sur le jeu à libérer
*\pre Le jeu doit être initialisé
*\post Le jeu ne doit plus être présent dans le tas
*\warning Cette fonction est à utiliser avec jeuInit. Les données du jeu seront définitivement perdues.
*/
void freeJeu(jeu* laby);





#endif
